package com.common.tools;

import java.util.Random;
import java.util.regex.Pattern;

/**
 * 字符串工具类 <功能详细描述>
 * 
 * @author chenlujun
 * @version [版本号, 2014年9月30日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public abstract class StringTools {
	/**
	 * 判断字符串是否为空 <功能详细描述>
	 * 
	 * @param str
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	public static boolean isNull(String str) {
		if (null == str) {
			return true;
		}

		str = str.replaceAll(" ", "");
		if ("".equals(str)) {
			return true;
		}

		return false;
	}

	/**
	 * 16进制字符串转字节数组 HexString——>byte
	 * 
	 * @param hexString
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	public static byte[] hexStringToBytes(String hexString) {
		if (hexString == null || hexString.equals("")) {
			return null;
		}
		hexString = hexString.toUpperCase();
		int length = hexString.length() / 2;
		char[] hexChars = hexString.toCharArray();
		byte[] d = new byte[length];
		for (int i = 0; i < length; i++) {
			int pos = i * 2;
			d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));

		}
		return d;
	}

	private static byte charToByte(char c) {
		return (byte) "0123456789ABCDEF".indexOf(c);
	}

	/**
	 * 字节数组转换为16进制字符串 <功能详细描述>
	 * 
	 * @param src
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	public static String bytesToHexString(byte[] src) {
		StringBuilder stringBuilder = new StringBuilder("");
		if (src == null || src.length <= 0) {
			return null;
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}

	/**
	 * 生成随机码 <功能详细描述>
	 * 
	 * @param number
	 *            生成随机码的位数
	 * @return [参数说明]
	 * 
	 * @return String [返回类型说明]
	 * @exception throws [违例类型] [违例说明]
	 * @see randomCode
	 */
	public static String randomCode(int number) {
		// 生成随机码
		String verifyCode = "";

		for (int i = 0; i < number; i++) {
			Random r = new Random();
			verifyCode += String.valueOf(r.nextInt(10));
		}
		return verifyCode;
	}

	/**
	 * 判断是否为浮点数，包括double和float
	 * 
	 * @param str
	 * @return [参数说明]
	 * 
	 * @return boolean true:是浮点数 false：不是浮点数
	 * @exception throws [违例类型] [违例说明]
	 * @see [类、类#方法、类#成员]
	 */
	public static boolean isDouble(String str) {
		Pattern pattern = Pattern.compile("^[-\\+]?[.\\d]*$");
		return pattern.matcher(str).matches();
	}

	/**
	 * 判断是否只包含数字
	 * 
	 * @param str
	 * @return boolean true:只包含数字，false：不全是数字
	 * @see [类、类#方法、类#成员]
	 */
	public static boolean isNumber(String str) {
		Pattern pattern = Pattern.compile("^[\\d]*$");
		return pattern.matcher(str).matches();
	}

	/**
	 * 判断是否数字字母组合
	 * 
	 * @param str
	 *            需要验证的参数
	 * @return boolean true :是 false：不是
	 * 
	 * @see [类、类#方法、类#成员]
	 */
	public static boolean isNumberOrLetter(String str) {
		if (null == str || "".equals(str)) {
			return false;
		} else {
			return Pattern.matches("^[0-9A-Za-z]+$", str);
		}
	}

	/**
	 * 判断是否电子邮件格式
	 * 
	 * @param str
	 *            需要验证的参数
	 * @return boolean true：是 false：不是
	 * 
	 * @see [类、类#方法、类#成员]
	 */
	public static boolean isEmail(String str) {
		if (null == str || "".equals(str)) {
			return false;
		} else {
			return Pattern
					.matches("^(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w+)+)$", str);
		}
	}

	/**
	 * 判断是否11位手机号
	 * 
	 * @param str
	 *            需要验证的参数
	 * @return boolean true：是 false：不是
	 * @see [类、类#方法、类#成员]
	 */
	public static boolean isMobilePhone(String str) {
		if (null == str || "".equals(str)) {
			return false;
		} else {
			return Pattern.matches("^1[3|5|7|8|][0-9]{9}$", str);
		}
	}

	/**
	 * 把带单位的文件大小转换为不带单位的大小，不带单位的文件大小单位为byte；
	 * 
	 * 文件大小单位可以是，B、K、M、G
	 * 
	 * @param fileSize
	 *            带单位文件大小
	 * @return 返回-1表示转换出错
	 * @see [类、类#方法、类#成员]
	 */
	public static long fileSizeUnitToByte(String fileSize) {

		if (StringTools.isNull(fileSize)) {
			return -1;
		}

		// 获取文件大小单位
		String unit = fileSize.substring(fileSize.length() - 1);
		unit = unit.toUpperCase();
		if ((!"B".equals(unit)) && (!"K".equals(unit)) && (!"M".equals(unit))
				&& (!"G".equals(unit))) {
			return -1;
		}

		// 获取文件大小数值部分
		String fileSizeNum = fileSize.substring(0, fileSize.length() - 1);
		if (!StringTools.isDouble(fileSizeNum)) {
			return -1;
		}

		// 转化
		Double fileSizeD = Double.valueOf(fileSizeNum);
		if ("B".equals(unit)) {
			return fileSizeD.longValue();
		} else if ("K".equals(unit)) {
			Double fileSizeDK = fileSizeD * 1024;
			return fileSizeDK.longValue();
		} else if ("M".equals(unit)) {
			Double fileSizeDM = fileSizeD * 1024 * 1024;
			return fileSizeDM.longValue();
		} else if ("G".equals(unit)) {
			Double fileSizeDG = fileSizeD * 1024 * 1024 * 1024;
			return fileSizeDG.longValue();
		}

		return 0;
	}
}
